package br.com.seuimovelnamao.controller;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.seuimovelnamao.PasswordGenerator;
import br.com.seuimovelnamao.PropertiesLoaderImpl;
import br.com.seuimovelnamao.TipoPessoa;
import br.com.seuimovelnamao.dao.UsuarioDAO;
import br.com.seuimovelnamao.model.Usuario;

@Controller
public class UsuarioController {
	
	/**
	 * @param usuario
	 * @param response
	 * @param errors
	 * @param request
	 * @return
	 * Ajax para validar os campos para criacao de usuario
	 */
	@RequestMapping("validarCriacaoUsuario")
	public ModelAndView validarCriacaoUsuario(Usuario usuario, HttpServletResponse response, Errors errors, HttpServletRequest request){
		
		Session session = (Session)request.getAttribute("hibernateSession");
		
		ModelAndView mv = new ModelAndView();
		boolean valida = false;
		
		// valida o usuario
		valida = validaUsuario(usuario, mv, session);
		
		if(!valida){
			mv.setViewName("imoveis/erro-validacao-anuncio");
			response.setStatus(500);
		}else{
			mv.setViewName("ok");
			response.setStatus(200);
		}
		
		return mv;
	}
	
	/**
	 * @param usuario
	 * @param mv
	 * @param session
	 * @return
	 * Valida os campos para criacao de usuario
	 */
	public boolean validaUsuario(Usuario usuario, ModelAndView mv, Session session){
		
		if(TipoPessoa.PF.equals(usuario.getTipoPessoa())){
			if("".equals(usuario.getNome())){
				mv.addObject("dataField", "nome");
				mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_nome"));
				return false;
			}else if("".equals(usuario.getCpf())){
				mv.addObject("dataField", "cpf");
				mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_cpf"));
				return false;
			}
		}else if(TipoPessoa.PJ.equals(usuario.getTipoPessoa())){
			if("".equals(usuario.getNomeFantasia())){
				mv.addObject("dataField", "nomeFantasia");
				mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_nomefantasia"));
				return false;
			}else if("".equals(usuario.getCnpj())){
				mv.addObject("dataField", "cnpj");
				mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_cnpj"));
				return false;
			}
		}
		if(usuario.getEndereco().getId() == 0){
			mv.addObject("dataField", "usuariocep");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_cep"));
			return false;
		}else if(usuario.getNumero() == 0){
			mv.addObject("dataField", "usuarionumero");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_numero"));
			return false;
		}else if("".equals(usuario.getEmail())){
			mv.addObject("dataField", "email");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_email"));
			return false;
		}else{
			//Valida o formato do email - asd@asd.com
			Pattern p = Pattern.compile(".+@.+\\.[a-z]+");  
			Matcher m = p.matcher(usuario.getEmail());  
			  
			boolean matchFound = m.matches();  
			  
			if (!matchFound)  {
				mv.addObject("dataField", "email");
				mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_email_invalido"));
				return false;
			}
		}
		if("".equals(usuario.getSenha())){
			mv.addObject("dataField", "senha");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_senha"));
			return false;
		}
		if(usuario.getSenha().length() < 6 || usuario.getSenha().length() > 12){
			mv.addObject("dataField", "senha");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_tamanho_senha"));
			return false;
		}
		
		//Verifica se ja existe o email cadastrado
		UsuarioDAO dao = new UsuarioDAO(session);
		Usuario u = dao.getUsuarioPorEmail(usuario);
		if(u != null){
			mv.addObject("dataField", "email");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_email_duplicado"));
			return false;
		}
		
		return true;
		
	}
	
	/**
	 * @param usuario
	 * @param session
	 * @throws Exception
	 * Salva o usuario no banco
	 */
	public void salvarUsuario(Usuario usuario, Session session) throws Exception{
		
		UsuarioDAO usuarioDAO = new UsuarioDAO(session);
		
		usuarioDAO.salva(usuario);
		
	}
	
	@RequestMapping("/memberArea/formCadastrarCorretor")
	public String formCadastrarCorretor(){
		return "usuarios/cadastrar-corretor";
	}
	
	/**
	 * @param usuario
	 * @param response
	 * @param errors
	 * @param request
	 * @return
	 *  Ajax que valida os campos no cadastro de um corretor
	 */
	@RequestMapping("/ajaxValidarCadastroCorretor")
	public ModelAndView ajaxValidarCadastroCorretor(Usuario usuario, HttpServletResponse response, Errors errors, HttpServletRequest request){
		
		Session session = (Session)request.getAttribute("hibernateSession");
		
		ModelAndView mv = new ModelAndView();
		boolean valida = false;
		
		// valida o corretor
		valida = validaCorretor(usuario, mv, session);
		
		if(!valida){
			mv.setViewName("imoveis/erro-validacao-anuncio");
			response.setStatus(500);
		}else{
			mv.setViewName("ok");
			response.setStatus(200);
		}
		
		return mv;
	}
	
	/**
	 * @param usuario
	 * @param mv
	 * @param session
	 * @return
	 * Valida os campos do corretor
	 */
	public boolean validaCorretor(Usuario usuario, ModelAndView mv, Session session){
		
		if("".equals(usuario.getNome())){
			mv.addObject("dataField", "nome");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_nome"));
			return false;
		}else if("".equals(usuario.getEmail())){
			mv.addObject("dataField", "email");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_email"));
			return false;
		}else{
			//Valida o formato do email - asd@asd.com
			Pattern p = Pattern.compile(".+@.+\\.[a-z]+");  
			Matcher m = p.matcher(usuario.getEmail());  
			  
			boolean matchFound = m.matches();  
			  
			if (!matchFound)  {
				mv.addObject("dataField", "email");
				mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_email_invalido"));
				return false;
			}
		}
		
		//Verifica se ja existe o email cadastrado
		UsuarioDAO dao = new UsuarioDAO(session);
		Usuario u = dao.getUsuarioPorEmail(usuario);
		if(u != null){
			mv.addObject("dataField", "email");
			mv.addObject("errorMessage", PropertiesLoaderImpl.getValor("erro_valida_email_duplicado"));
			return false;
		}
		
		return true;
		
	}
	
	/**
	 * @param usuario
	 * @param request
	 * @return
	 * @throws Exception
	 * Cadastra o corretor no banco de dados, adiciona a imobiliaria como Owner e gera uma senha
	 * aleatoria
	 */
	@RequestMapping("/memberArea/cadastrarCorretor")
	public String cadastrarCorretor(Usuario usuario, HttpServletRequest request) throws Exception{
		
		Session session = (Session)request.getAttribute("hibernateSession");
		
		// Adiciona a imobiliaria como Owner
		usuario.setOwner((Usuario)request.getSession().getAttribute("usuario"));
		usuario.setTipoPessoa(TipoPessoa.CORRETOR);
		
		// Gera uma senha aleatoria
		usuario.setSenha(PasswordGenerator.getRandomPassword(6));
		
		salvarUsuario(usuario, session);
		
		//TODO
		/******************
		 * Aqui deve enviar email para o corretor com os dados e a senha
		 *****************/
		
		return "usuarios/corretor-cadastrado";
	}

}
